#ifndef _LIST_H_
#define _LIST_H_

#include <stdbool.h>
#include <stddef.h> /* size_t */

typedef struct list_node {
    struct list_node *next, *prev;
} list_node;

void list_init(list_node * list);
void list_add(list_node * head, list_node * node);
void list_tailadd(list_node * head, list_node * node);
void list_del(list_node * node);
bool list_empty(const list_node * head);
bool list_one(const list_node * head);

// 确保外层结构体中的list_node结构体的成员名固定为`node`
#define LIST_ENTRY(ptr, type) \
        ((type*)((char *)(ptr) - ((size_t)(&((type*)0)->node))))

#endif /* _LIST_H_ */
